在 Vite 项目中,public 和 src/assets(或 src 下的其他静态资源目录)是存放静态资源的两个核心位置。它们在构建工具的处理方式、引用路径以及适用场景上有着本质的区别。
以下是它们的主要区别:
1. 构建处理方式
public目录:该目录下的资源不会经过 Vite 的构建处理。在打包时,这些文件会被原封不动地直接复制到输出目录(通常是dist)的根目录下,文件名保持不变,不会被压缩、转译或添加哈希后缀。src目录(如src/assets):该目录下的资源会被 Vite 视为模块依赖并纳入构建管道。在打包时,Vite 会对它们进行优化处理,例如图片压缩、重命名并追加哈希值(如logo.a1b2c3.png),以支持长效缓存和减小文件体积。
2. 引用与访问路径
public目录:必须使用根绝对路径来引用。例如,public/icon.png在代码中应写为/icon.png。如果在 JS/TS 中使用相对路径或字符串拼接引用,可能会因为构建后路径固定而导致开发环境与生产环境不一致的问题。src目录:推荐使用相对路径或通过import语句显式导入。对于动态生成的路径,不能直接拼接字符串,而需要使用new URL(path, import.meta.url)或import.meta.globAPI 来处理,以确保 Vite 能在构建时正确解析资源。
3. 适用场景
public目录:适合存放完全不需要构建处理的“原生资源”。典型场景包括:- 网站图标(
favicon.ico)、PWA 清单(site.webmanifest)、搜索引擎爬虫配置(robots.txt)等。 - 必须保持原有文件名的资源(如供用户下载的 PDF 手册)。
- 需要通过固定绝对路径直接访问的资源,或在 HTML 模板中通过
<script>标签引入的第三方 SDK 脚本。
- 网站图标(
src目录:适合存放项目内部业务强相关的资源。典型场景包括:- 组件中引用的图片、样式表、字体等。
- 需要被 Vite 压缩和优化以提升网页加载速度的媒体文件。
- 需要在 JavaScript/TypeScript 中作为模块导入使用的资源。
总结对比
| 特性 | public 目录 | src 目录 (如 src/assets) |
|---|---|---|
| 处理方式 | 不处理,原样复制到 dist 根目录 | 经过 Vite 处理,可能压缩、哈希化 |
| 引用方式 | 必须使用根绝对路径(如 /img.png) | 使用相对路径或 import 导入 |
| 文件名 | 保持原样,无哈希值 | 默认追加哈希值,利于缓存 |
| 适用资源 | favicon、robots.txt、第三方库脚本等 | 业务图片、CSS、字体、需优化的媒体文件等 |
简单来说,一个实用的原则是:需要 Vite 帮你处理(如哈希缓存、压缩)的资源放 src/assets;完全静态、需要原样复制且路径固定的资源放 public。
需要我补充一下在开发环境(Vite dev)和生产环境(Vite build)中,这两个目录的资源访问路径差异吗?实际开发中很容易踩坑。